package io.practiceinsight.pinpayments.utils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.springframework.util.Base64Utils;

import com.google.inject.Inject;
import com.google.gson.Gson;
import io.practiceinsight.pinpayments.ParamsHelper;
import io.practiceinsight.pinpayments.http.HttpMethod;
import io.practiceinsight.pinpayments.http.HttpResponse;
import io.practiceinsight.pinpayments.http.HttpTransport;
import io.practiceinsight.pinpayments.pojo.ErrorResponse400;
import io.practiceinsight.pinpayments.pojo.ErrorResponseCard;
import io.practiceinsight.pinpayments.pojo.ResponseBrankAccount;
import io.practiceinsight.pinpayments.pojo.ResponseCard;
import io.practiceinsight.pinpayments.pojo.ResponseCharges;
import net.sf.json.JSONObject;
/**
 * pinpay支付工具类
 * @author DN
 *
 */
public  class PinPayHttpUtils {

	@Inject
	  private ParamsHelper paramsHelper;
	//正式环境域名  api.pinpayments.com   key=L7ADR1o5tnvfv6lPlqjdhQ
		//测试环境域名  test-api.pinpayments.com    key=udYh_uLZKYnU1OQbYts
	static String encoding = new String(Base64Utils.encode("L7ADR1o5tnvfv6lPlqjdhQ".getBytes()));//加密的账号密码
		
	//创建客户的卡 获取token 
	/**
	 * 卡API允许您安全地存储支付卡细节以换取卡令牌。然后，可以使用此卡令牌创建收费API的单个费用，或使用客户API随时间创建多个费用。

		每个卡片对象都有一个属性primary，它说明卡片是否是客户的主卡。它的价值在于， true如果卡是其客户的主卡，false如果它是客户的 非主卡，并且 null与客户记录没有关联。
		
		卡片令牌只能使用一次，以创建费用或客户。如果在一个月内未创建费用或客户，则令牌自动失效。
		
		使用此API存储卡详细信息时有两种身份验证方法：
		
		在您的安全环境中，使用您的一个秘密API密钥使用HTTP基本访问验证。
		在不安全的环境中，如Web浏览器或移动应用程序，通过使用其中一个可发布的API密钥。
		这个API支持JSONP。
	 * @return
	 */
	public static Map<String,Object> sendPinPayCreateCardPost(Map<String, String> map){
				Object result = null;
				Map<String,Object> resultMap = new HashMap<>();
		    	final HttpResponse httpResponse =getPost("https://api.pinpayments.com/1/cards", map);
				if(httpResponse.getStatusCode()==201){
					result= JSONObject.toBean(JSONObject.fromObject(httpResponse.getContent()), ResponseCard.class);
					
				}else if(httpResponse.getStatusCode()==422){
					System.out.println("-----------");
					System.out.println("httpResponse.getError()="+httpResponse.getError());
					String ss=httpResponse.getError();
					result=JSONObject.toBean(JSONObject.fromObject(ss), ErrorResponseCard.class);
					System.out.println("result="+result);
				}
				resultMap.put("code", httpResponse.getStatusCode());
				resultMap.put("obj", result);
				return resultMap;
	}
	/**
	 *  司机使用
	 * 银行账户API允许您安全地存储银行账户信息以换取银行账户令牌。然后可以使用此令牌使用收件人API创建收件人。

		银行账户令牌只能使用一次来创建收件人。如果令牌没有被使用，令牌会在一个月后自动过期。
		
		使用此API存储银行帐户详细信息时有两种身份验证方式：
		
		在您的安全环境中，使用您的一个秘密API密钥使用HTTP基本访问验证。
		在不安全的环境中，如Web浏览器或移动应用程序，通过使用其中一个可发布的API密钥。
		这个API支持JSONP。
	 * @return
	 */
	public static Map<String,Object> sendPinPayCreateRecipientPost(Map<String, String> map){
		Object result = null;
		Map<String,Object> resultMap = new HashMap<>();
		final HttpResponse httpResponse =getPost("https://api.pinpayments.com/1/recipients", map);
    	if(httpResponse.getStatusCode()==201){
			result= JSONObject.toBean(JSONObject.fromObject(httpResponse.getContent()), ResponseBrankAccount.class);
			resultMap.put("code", httpResponse.getStatusCode());
			resultMap.put("obj", result);
		}else if(httpResponse.getStatusCode()==422){
			System.out.println("--------------------------------------");
			System.out.println("recipients httpResponse.getError()="+httpResponse.getError());
			String ss=httpResponse.getError();
			result=JSONObject.toBean(JSONObject.fromObject(ss), ErrorResponseCard.class);
			resultMap.put("code", httpResponse.getStatusCode());
			resultMap.put("obj", result);
		}
		return resultMap;
	}
	//收取客户的钱
	/**
	 * 创建新的费用并返回其详细信息。这可能是一个长期的要求。
	 * @param map
	 * @return
	 */
	
	public static Map<String,Object> sendPinPayChargesPost(Map<String, String> map){
		Object result = null;
		Map<String,Object> resultMap = new HashMap<>();
    	final HttpResponse httpResponse =getPost("https://api.pinpayments.com/1/charges", map);
    	if(httpResponse.getStatusCode()==201){
			result= JSONObject.toBean(JSONObject.fromObject(httpResponse.getContent()), ResponseCharges.class);
			
		}else if(httpResponse.getStatusCode()==422){
			System.out.println("--------------------------------------");
			System.out.println("recipients httpResponse.getError()="+httpResponse.getError());
			String ss=httpResponse.getError();
			result=JSONObject.toBean(JSONObject.fromObject(ss), ErrorResponseCard.class);
		}else if(httpResponse.getStatusCode()==400){
			System.out.println("--------------------------------------");
			System.out.println("recipients httpResponse.getError()="+httpResponse.getError());
			String ss=httpResponse.getError();
			result=JSONObject.toBean(JSONObject.fromObject(ss), ErrorResponse400.class);
		}
		resultMap.put("code", httpResponse.getStatusCode());
		resultMap.put("obj", result);
		return resultMap;
	}
	
	
	
	public static HttpResponse getPost(String url,Map<String, String> map){
		try {
			final HttpResponse httpResponse = new HttpTransport()
			        .addHeader("Content-Type", "application/x-www-form-urlencoded")
			        .addHeader("Authorization", "Basic "+encoding)
			        .setHttpMethod(HttpMethod.POST)
			        .setUrl(url)
			        .addParams(map)
			        .execute();
			System.out.println("encoding="+encoding);
		return	httpResponse;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}
